//let与var的区别  块级隔离
{
	let a = 10;
	var b = 1;
}
console.log(a) // ReferenceError: a is not defined.
console.log(b) // 1



//let 不会出现变量提升这种傻逼的设定
console.log(foo); // 输出undefined
var foo = 2;
console.log(bar); // 报错ReferenceError
let bar = 2;


//暂时性死区  temporal dead zone，简称 TDZ
var tmp = 123;
if (true) {
	tmp = 'abc'; //ReferenceError
	let tmp;
}

//tdz的结束
if (true) {
	// TDZ开始
	tmp = 'abc'; // ReferenceError
	console.log(tmp); // ReferenceError

	let tmp; // TDZ结束
	console.log(tmp); // undefined

	tmp = 123;
	console.log(tmp); // 123

	//'暂时性死区'也意味着typeof不再是一个百分之百安全的操作。
	typeof x; // ReferenceError
	let x;
	//作为比较，如果一个变量根本没有被声明，使用typeof反而不会报错。
	typeof undeclared_variable // "undefined"
}



//较为隐蔽的死区
function bar(x = y, y = 2) {
	return [x, y]
}
bar(); // 报错  因为y还没被定义就使用
var x = x; // 不报错 因为有变量提升
let x = x; // 报错  因为使用let没有变量提升




//相同作用域内不允许重复声明

function func() { // 报错
	let a = 10;
	var a = 1;
}

function func() { // 报错
	let a = 10;
	let a = 1;
}



function func(arg) {
	let arg;
}
func() // 报错


function func(arg) {
	{
		let arg;
	}
}
func() // 不报错 不在一个快级作用域内


/*

总结:var会有变量提升  let没有变量提升=>但是会导致暂时性死区  总体的话 没有变量提升会减少错误发生的概率 const也具有相同的特性

*/